﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using SSDPNET.Geom;
using ATEC.ATDataCoreNET;

namespace ATSceneExample
{
    /// <summary>
    /// 分类：玄镜BIM图形平台/C#开发/示例代码/场景管理/三维场景管理。
    /// 内容：提供对三维设计场景的创建、删除、重命名等操作的实现示例。
    /// 功能：
    /// - 创建新的三维设计场景。
    /// - 获取现有的三维场景。
    /// - 删除指定的三维场景。
    /// - 重命名现有的三维场景。
    /// 关键类及说明：
    /// - **ATProject**: 表示当前活动的工程对象，用于操作和管理项目中的场景。
    /// - **ATScene**: 表示具体的场景对象，包含场景的几何和视图信息。
    /// - **SceneInfo**: 表示场景的元数据（例如场景名称、设置等）。
    /// - **SceneID**: 用于标识场景的唯一ID。
    /// 注意：
    /// - 确保操作的场景有效且存在。
    /// - 调用 `scene.SaveSceneSettings()` 来保存重命名后的场景设置。
    /// </summary>
    public class ATSceneMethod
    {
        // 三维设计场景的名称常量
        private const string ThreeDSceneName = "3DDesignScene";

        // 重命名后的三维设计场景名称常量
        private const string RenamedThreeDSceneName = "Renamed3DDesignScene";

        /// <summary>
        /// 创建三维设计场景
        /// 功能：在当前项目中创建一个新的三维设计场景
        /// </summary>
        public static void Create3DDesignScene()
        {
            // 定义场景类型为普通场景
            ATScenesType scenesType = ATScenesType.Normal;

            // 获取当前活动项目
            ATProject activeProject = ATEC.ATCore.Session.Entity.GetActiveATProject();

            // 定义场景创建状态
            ATScenesStatus status;

            // 调用项目对象的CreateNewScene方法创建一个新的三维设计场景
            activeProject.CreateNewScene(out status, ThreeDSceneName, scenesType, false, null);
        }

        /// <summary>
        /// 获取指定场景对象
        /// 功能：根据项目和场景名称获取相应的场景对象
        /// </summary>
        /// <param name="project">当前项目对象</param>
        /// <param name="scenceName">场景名称，默认为"default"</param>
        /// <returns>返回指定名称的场景对象</returns>
        public static ATScene GetATScene(ATProject project, string scenceName = "default")
        {
            // 默认获取项目中的根场景ID
            SceneID sceneID = project.DefaultSceneId;

            // 如果指定的场景名称不是"default"，则查找相应场景的ID
            if (!scenceName.Equals("default"))
                sceneID = project.FindSceneIdByName(scenceName);

            // 定义加载场景时的状态
            StatusInt status = StatusInt.Error;

            // 加载场景对象
            ATScene scene = project.LoadRootSceneById(ref status, sceneID);
            return scene;
        }

        /// <summary>
        /// 删除三维设计场景
        /// 功能：从当前项目中删除指定的三维设计场景
        /// </summary>
        public static void Delete3DDesignScene()
        {
            // 获取当前活动项目
            ATProject activeProject = ATEC.ATCore.Session.Entity.GetActiveATProject();

            // 获取指定的三维设计场景
            ATScene scene = GetATScene(activeProject, ThreeDSceneName);

            // 如果场景不存在或无效，直接返回
            if (scene == null || !scene.IsValid())
                return;

            // 删除场景
            activeProject.DeleteScene(scene);
        }

        /// <summary>
        /// 重命名三维设计场景
        /// 功能：将指定的三维设计场景重命名为新的名称
        /// </summary>
        public static void Rename3DDesignScene()
        {
            // 获取当前活动项目
            ATProject activeProject = ATEC.ATCore.Session.Entity.GetActiveATProject();

            // 获取指定的三维设计场景
            ATScene scene = GetATScene(activeProject, ThreeDSceneName);

            // 如果场景不存在或无效，直接返回
            if (scene == null || !scene.IsValid())
                return;

            // 获取场景信息对象
            SceneInfo sceneInfo = scene.GetSceneInfo();

            // 如果场景名称无效，返回
            if (!SceneInfo.IsNameValid(ThreeDSceneName))
                return;

            // 重命名场景
            sceneInfo.Name = RenamedThreeDSceneName;

            // 设置更新后的场景信息
            scene.SetSceneInfo(sceneInfo);

            // 保存场景设置的更改
            scene.SaveSceneSettings();
        }
    }
}
